#include "Extras/leitura.h"
#include "Vetor_Ponto/Vector.h"
#include "Vetor_Ponto/Point.h"
#include "LineSegment.h"
#include "pseudoangulo.h"
#include "poligono.h"
#include <iostream>
using namespace std;

void exemplos_vetor_ponto()
{
    Vector v("1 ,0, 1");
    Point  p("-2,1,-2"),q;

    cout<<"* Ponto \"p\": ";p.imprimir();
    cout<<"\n* Vetor \"v\": ";v.imprimir();
    q = p + v;
    cout<<"\n* Ponto \"q\": q = p + v: ";q.imprimir();
    v = p - q;
    cout<<"\n* Vetor \"v\": v = p - q: ";v.imprimir();

    Vector a("1,3,8");
    cout<<"\n\n* Vetor \"a\": ";a.imprimir();
    cout<<"\n|a| = "<<a.norma()<<endl;

    Vector b(2*a);b(0)=1;
    cout<<"* Vetor \"b\": ";b.imprimir();
    cout<<"\n|b| = "<<b.norma()<<endl;

    cout<<"\n* a . b = "<<(a ^ b)<<endl;

    Vector c;
    c = a * b * Vector("1,2,3");
    cout<<"\n* Vetor \"c\": c = a x b x (1,2,3): ";c.imprimir();
    cout<<"\n|c| = "<<c.norma()<<endl;

    Vector d;
    d = a + b + 5*c + Vector("6,6,6");
    cout<<"\n* Vetor \"d\": d = a + b + 5*c + (6,6,6): ";d.imprimir();
    cout<<"\n|d| = "<<d.norma()<<endl;

    cout<<"\n* Angulo (em graus) entre \"c\" e \"d\": "<<anguloGrau(c,d)<<endl;
}

void exemplos_pseudoangulo(const vector<Point>& pontos)
{
    Vector a(pontos[0].paraVector());
    Vector b(pontos[1].paraVector());
    Vector c(pontos[2].paraVector());
    Vector d(pontos[3].paraVector());

    cout<<"* Pseudo-angulos:"<<endl;
    a.imprimir();cout<<" = "<<pseudoangulo(a)<<endl;
    b.imprimir();cout<<" = "<<pseudoangulo(b)<<endl;
    c.imprimir();cout<<" = "<<pseudoangulo(c)<<endl;
    d.imprimir();cout<<" = "<<pseudoangulo(d)<<endl;

    cout<<"\n* Pseudo-angulos entre dois vetores:"<<endl;
    Vector* v1 = &a;
    Vector* v2 = &b;
    v1->imprimir();cout<<" e ";v2->imprimir();cout<<" = "<<pseudoangulo(*v1,*v2)<<endl;
    v2->imprimir();cout<<" e ";v1->imprimir();cout<<" = "<<pseudoangulo(*v2,*v1)<<endl;

    cout<<"\n* Posicionamento entre entre dois vetores:"<<endl;
    v1 = v1;
    v2 = v2;
    v1->imprimir();cout<<" esta ";
    switch(posicao(*v1,*v2))
    {
        case -1:
        {
            cout<<"a esquerda de ";
            break;
        }
        case 1:
        {
            cout<<"a direita de ";
            break;
        }
        default:
        {
            cout<<"alinhado com ";
            break;
        }
    }
    v2->imprimir();
    cout<<endl;
}

void exemplos_segmento(const vector<Point>& pontos)
{
    LineSegment linha(pontos[0],pontos[1]);
    LineSegment linha2(pontos[2],pontos[3]);

    cout<<"* Segmento: ";linha.imprimir();cout<<endl;
    cout<<"* Comprimento: "<<linha.comprimento()<<endl;

    Point p(pontos[4]);
    cout<<"* Area com o ponto ";p.imprimir();
    cout<<": "<<linha.area_triangulo(p)<<endl;

    cout<<"* Distancia ao ponto ";p.imprimir();
    cout<<": "<<linha.distancia(p)<<endl;

    cout<<"* Intercepta ";linha2.imprimir();
    if(linha.intercepta(linha2)) cout<<": sim.";else cout<<": nao.";
    cout<<endl;
}

void exemplos_ponto_em_poligono(const vector<Point>& pontos)
{
    if (pontos.empty())
    {
        cout<<"* O vetor de entrada esta vazio!!!"<<endl;
        return;
    }
    vector<Point> pol = pontos;
    // Pegar o ponto de maior "x"
    size_t maior = 0;
    for (size_t i=1 ; i<pol.size() ; i++) if (pol[i](0) > pol[maior](0)) maior = i;

    cout<<"* MAIOR: ";pol[maior].imprimir();cout<<endl;
    Point P("0.5,0");
    // "L" é o ponto final da "RetaL":
    Point L = P + (2 * (pol[maior] - P).norma()) * Vector("1,0");
    cout<<"* Ponto L: ";L.imprimir();cout<<endl;

    cout<<"* Poligono:"<<endl;
    size_t n=0;
    // Segmento de reta de "P" a "L":
    LineSegment RetaL(P,L);
    // Checar cruzamento da RetaL com todas as arestas do poligono:
    pol.push_back(pol.front());
    for (size_t i=1 ; i<pol.size() ; i++)
    {
        LineSegment seg(pol[i-1],pol[i]);
        if (RetaL.intercepta(seg))
        {
            n++;
            seg.imprimir();
            cout<<endl;
        }
    }

    cout<<"(N = "<<n<<") P esta ";
    if (n%2) cout<<"dentro!"<<endl;
    else     cout<<"fora."<<endl;
}

int main()
{
    //exemplos_vetor_ponto();
    exemplos_pseudoangulo(ler("Entradas/pseudoangulos.txt"));
    //exemplos_segmento(ler("Entradas/segmentos.txt"));
    //exemplos_ponto_em_poligono(ler("Entradas/poligonos.txt"));
    //for(vector<Point>::iterator p=pontos.begin() ; p<pontos.end() ; p++){(*p).imprimir();cout<<endl;}
    return(0);
}
